// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2013, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.samples.text.datetimepatterngenerator;

// ---getBestPatternExample
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateTimePatternGenerator;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;
import java.util.Date;

// ---getBestPatternExample
/** com.ibm.icu.text.DateTimePatternGenerator Sample Code */
public class DateTimePatternGeneratorSample {

    public static void main(String[] args) {
        getBestPatternExample();
        addPatternExample();
        replaceFieldTypesExample();
    }

    public static void getBestPatternExample() {
        System.out.println(
                "========================================================================");
        System.out.println(" getBestPatternExample()");
        System.out.println();
        System.out.println(" Use DateTimePatternGenerator to create customized date/time pattern:");
        System.out.println(" yQQQQ,yMMMM, MMMMd, hhmm, jjmm per locale");
        System.out.println(
                "========================================================================");
        // ---getBestPatternExample
        final String[] skeletons = {
            "yQQQQ", // year + full name of quarter, i.e., 4th quarter 1999
            "yMMMM", // year + full name of month, i.e., October 1999
            "MMMMd", // full name of month + day of the month, i.e., October 25
            "hhmm", // 12-hour-cycle format, i.e., 1:32 PM
            "jjmm" // preferred hour format for the given locale, i.e., 24-hour-cycle format for
            // fr_FR
        };
        final ULocale[] locales = {
            new ULocale("en_US"), new ULocale("fr_FR"), new ULocale("zh_CN"),
        };
        DateTimePatternGenerator dtfg = null;
        Date date = new GregorianCalendar(1999, 9, 13, 23, 58, 59).getTime();
        System.out.printf("%-20s%-35s%-35s%-35s\n\n", "Skeleton", "en_US", "fr_FR", "zh_CN");
        for (String skeleton : skeletons) {
            System.out.printf("%-20s", skeleton);
            for (ULocale locale : locales) {
                // create a DateTimePatternGenerator instance for given locale
                dtfg = DateTimePatternGenerator.getInstance(locale);
                // use getBestPattern method to get the best pattern for the given skeleton
                String pattern = dtfg.getBestPattern(skeleton);
                // Constructs a SimpleDateFormat with the best pattern generated above and the given
                // locale
                SimpleDateFormat sdf = new SimpleDateFormat(pattern, locale);
                // Get the format of the given date
                System.out.printf("%-35s", sdf.format(date));
            }
            System.out.println("\n");
        }
        /**
         * output of the sample code:
         * ************************************************************************************************************
         * Skeleton en_US fr_FR zh_CN
         *
         * <p>yQQQQ 4th quarter 1999 4e trimestre 1999 1999年第四季度
         *
         * <p>yMMMM October 1999 octobre 1999 1999年10月
         *
         * <p>MMMMd October 13 13 octobre 10月13日
         *
         * <p>hhmm 11:58 PM 11:58 PM 下午11:58
         *
         * <p>jjmm 11:58 PM 23:58 下午11:58
         *
         * <p>************************************************************************************************************
         */
        // Use DateTime.getPatternInstance to produce the same Date/Time format with predefined
        // constant field value
        final String[] dtfskeleton = {
            DateFormat.YEAR_QUARTER, // year + full name of quarter, i.e., 4th quarter 1999
            DateFormat.YEAR_MONTH, // year + full name of month, i.e., October 1999
            DateFormat.MONTH_DAY // full name of month + day of the month, i.e., October 25
        };
        System.out.printf("%-20s%-35s%-35s%-35s\n\n", "Skeleton", "en_US", "fr_FR", "zh_CN");
        for (String skeleton : dtfskeleton) {
            System.out.printf("%-20s", skeleton);
            for (ULocale locale : locales) {
                // Use DateFormat.getPatternInstance to get the date/time format for the locale,
                // and apply the format to the given date
                String df = DateFormat.getPatternInstance(skeleton, locale).format(date);
                System.out.printf("%-35s", df);
            }
            System.out.println("\n");
        }

        /**
         * output of the sample code:
         * ***********************************************************************************************************
         * Skeleton en_US fr_FR zh_CN
         *
         * <p>yQQQQ 4th quarter 1999 4e trimestre 1999 1999年第四季度
         *
         * <p>yMMMM October 1999 octobre 1999 1999年10月
         *
         * <p>MMMMd October 13 13 octobre 10月13日
         * **********************************************************************************************************
         */
        // ---getBestPatternExample
    }

    public static void addPatternExample() {
        System.out.println(
                "========================================================================");
        System.out.println(" addPatternExample()");
        System.out.println();
        System.out.println(" Use addPattern API to add new '. von' to existing pattern");
        System.out.println(
                "========================================================================");
        // ---addPatternExample
        Date date = new GregorianCalendar(1999, 9, 13, 23, 58, 59).getTime();
        ULocale locale = ULocale.FRANCE;
        // Create an DateTimePatternGenerator instance for the given locale
        DateTimePatternGenerator gen = DateTimePatternGenerator.getInstance(locale);
        SimpleDateFormat format = new SimpleDateFormat(gen.getBestPattern("MMMMddHmm"), locale);
        DateTimePatternGenerator.PatternInfo returnInfo =
                new DateTimePatternGenerator.PatternInfo();
        // Add '. von' to the existing pattern
        gen.addPattern("dd'. von' MMMM", true, returnInfo);
        // Apply the new pattern
        format.applyPattern(gen.getBestPattern("MMMMddHmm"));
        System.out.println("New Pattern for FRENCH: " + format.toPattern());
        System.out.println("Date Time in new Pattern: " + format.format(date));

        /**
         * output of the sample code:
         * *************************************************************************************************
         * New Pattern for FRENCH: dd. 'von' MMMM HH:mm Date Time in new Pattern: 13. von octobre
         * 23:58
         *
         * <p>***********************************************************************************************
         */
        // ---addPatternExample
    }

    public static void replaceFieldTypesExample() {
        // Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
        System.out.println(
                "========================================================================");
        System.out.println(" replaceFieldTypeExample()");
        System.out.println();
        System.out.println(" Use replaceFieldTypes API to replace zone 'zzzz' with 'vvvv");
        System.out.println(
                "========================================================================");
        // ---replaceFieldTypesExample
        Date date = new GregorianCalendar(1999, 9, 13, 23, 58, 59).getTime();
        TimeZone zone = TimeZone.getTimeZone("Europe/Paris");
        ULocale locale = ULocale.FRANCE;
        DateTimePatternGenerator gen = DateTimePatternGenerator.getInstance(locale);
        SimpleDateFormat format = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz", locale);
        format.setTimeZone(zone);
        String pattern = format.toPattern();
        System.out.println("Pattern before replacement:");
        System.out.println(pattern);
        System.out.println("Date/Time format in fr_FR:");
        System.out.println(format.format(date));
        // Replace zone "zzzz" in the pattern with "vvvv"
        String newPattern = gen.replaceFieldTypes(pattern, "vvvv");
        // Apply the new pattern
        format.applyPattern(newPattern);
        System.out.println("Pattern after replacement:");
        System.out.println(newPattern);
        System.out.println("Date/Time format in fr_FR:");
        System.out.println(format.format(date));

        /**
         * output of the sample code:
         * **************************************************************************************************
         * Pattern before replacement: EEEE d MMMM y HH:mm:ss zzzz Date/Time format in fr_FR: jeudi
         * 14 octobre 1999 05:58:59 heure avancée d’Europe centrale Pattern after replacement: EEEE
         * d MMMM y HH:mm:ss vvvv Date/Time format in fr_FR: jeudi 14 octobre 1999 05:58:59 heure de
         * l’Europe centrale
         *
         * <p>************************************************************************************************
         */
        // ---replaceFieldTypesExample
    }
}
